package uid

import (
	"time"
	"fmt"
	"sync"
)

/**
 task id，任务id的生成器
 task id的组成为：
    idc(2位) | second(10位) | number(4位)
    说明：idc：最多支持99个
         second：当前时间秒
         number：一秒内，支持9999个task
 */

const (
	IDC = 1
)

/**
 参考上面的说明
 */
type TaskIdMaker struct {
	idc             int
	currentSec      int64
	number          int
}

/**
 生成task id值
 */
func (t *TaskIdMaker) CreateTaskId() string {

	tmpSec := time.Now().Unix()
	if tmpSec != t.currentSec {
		t.currentSec = tmpSec
		t.number = 0
	}

	t.number++
	return fmt.Sprintf("%02d%010d%04d", t.idc, t.currentSec, t.number)
}

/**
 用于设置idc的场景
 */
func (t *TaskIdMaker) SetIdc(idc int) {
	t.idc = idc
}

/**
 单例获取task id producer
 */
var taskIdMaker *TaskIdMaker
var taskIdOnce sync.Once

func TaskIdProducer() *TaskIdMaker {
	taskIdOnce.Do(func() {
		taskIdMaker = &TaskIdMaker{idc: IDC}
	})

	return taskIdMaker
}